package top.fzqblog.test;

import com.google.common.util.concurrent.Monitor;

import java.util.LinkedList;
import java.util.Queue;

public class MonitorSample {
        private Queue<Integer> queue = new LinkedList<Integer>();
        private Monitor monitor = new Monitor();
        //put 的Guard,重写方法,可以设置什么情况下返回ture,true就表示放行
        //这里表示当queue的大小在3个以下的时候可是进入
        private Monitor.Guard put = new Monitor.Guard(monitor) {
            @Override
            public boolean isSatisfied() {
                return queue.size() < 3;
            }
        };
        //只要queue里面有值,我们就可以取
        private Monitor.Guard get = new Monitor.Guard(monitor) {
            @Override
            public boolean isSatisfied() {
                return queue.size() > 0;
            }
        };

        public void set(int value) throws InterruptedException {
            //这种方式和try lock的方式相近.当时可以看出来,
            //比condition更加直观,每一个guard都可以设置一个 门槛,来放行,
            //当任何一个guard达到了条件,就会被唤醒.比如在size等于2的时候，做一些操作，
            //添加一个guard然后触发.这比condition更加好用
            //而且提供了更多的API
            monitor.enterWhen(put);
            try {
                queue.add(value);
            } finally {
                monitor.leave();
            }
        }
        public int get() throws InterruptedException {
            monitor.enterWhen(get);
            try {
                return queue.poll();
            } finally {
                monitor.leave();
            }
        }


}        